package OOA.com.JavaBasis.abstract1;
/*
* 向上造型与向下转型
*
* 向上造型：
* 由于抽象类不能够实例化，所以只能通过向上造型的方式创建对象，同时向上造型创建的对象调用的抽象方法是子类重写过的方法
* 向下转型：
* 向上造型的对象如果想要访问子类中子类独有的方法则就需要向下转型。如 double a = 1.11; int b = (int)a;就是向下转型的一种
*
* */
public class AbstractDemo {
    public static void main(String[] args) {

        AbstractDemo abstractDemo = new AbstractDemo();
        //向上造型
        Animal animal = new Dog();
        abstractDemo.showAnimal(animal);
//        animal.eat();
//        animal.sleep();
        System.out.println("==============");
        //向上造型
        Animal animal1 = new Pig();
        abstractDemo.showAnimal(animal1);
//        animal1.eat();
//        animal1.sleep();
        System.out.println("==============");




        //向下转型
        /*
        * 如果在向上造型时，anmial指向的是dog对象，所以对其进行向下转型的时候只能将其转成dog类，而不能将其转成pig类
        *            如：anmial1指向的是pig类，所以对其转型只能转成pig类，而不能将其转成dog类
        *            如果把anmial1转成dog类虽然语法上没有报错，但是运行的时候会发生报错，java.lang.ClassCastException（类型转换异常）
        *
        * 解决方法：
        *       在进行类型转化之前做一次必要的判断：使用 instanceof 关键字
        * 格式：
        *       变量名称  instanceof  类型
        *     这是一个boolean类型的表达式，如果符合后面的类型，返回true，否转返回false
        * */
        //Pig p = (Pig)animal;  这句话在逻辑上是错误的

        if(animal instanceof Dog){
            Dog d1 = (Dog) animal;
            d1.dogwork();
        }else if (animal instanceof Pig){
            Pig p1 = (Pig)animal1;
            p1.pigwork();
        }
        if(animal1 instanceof Dog){
            Dog d1 = (Dog) animal;
            d1.dogwork();
        }else if (animal1 instanceof Pig){
            Pig p1 = (Pig)animal1;
            p1.pigwork();
        }

    }


    public void showAnimal(Animal animal){
        animal.sleep();
        animal.eat();
    }
}
